<!DOCTYPE html>
<!-- saved from url=(0046)https://habr.com/ru/company/ruvds/blog/327754/ -->
<html lang="ru"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  
  <meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
  <title>Bash-скрипты, часть 8: язык обработки данных awk / Блог компании RUVDS.com / Хабр</title>
  <style>
    /* cyrillic-ext */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveSxf6TF0.woff2) format('woff2');
      unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
    }

    /* cyrillic */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveQhf6TF0.woff2) format('woff2');
      unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
    }

    /* latin-ext */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveSBf6TF0.woff2) format('woff2');
      unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
    }

    /* latin */
    @font-face {
      font-family: 'Fira Sans';
      font-style: normal;
      font-weight: 500;
      font-display: swap;
      src: url(https://fonts.gstatic.com/s/firasans/v11/va9B4kDNxMZdWfMOD5VnZKveRhf6.woff2) format('woff2');
      unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
    }
  </style>
  <link rel="preload" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.29e3fe9b.css" as="style"><link rel="preload" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.1ca41abb.js" as="script"><link rel="preload" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/app.b84b16a4.css" as="style"><link rel="preload" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/app.132461d8.js" as="script"><link rel="preload" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/about.428e0545.css" as="style"><link rel="preload" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/about.2d3fd602.js" as="script">
  <link rel="stylesheet" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.29e3fe9b.css"><link rel="stylesheet" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/app.b84b16a4.css"><link rel="stylesheet" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/about.428e0545.css">
  <script type="text/javascript" async="" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/js"></script><script async="" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/tag.js"></script><script async="" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/analytics.js"></script><script>window.i18nFetch = new Promise((res, rej) => {
          const xhr = new XMLHttpRequest();
          xhr.open('GET', '/js/i18n/ru-compiled.07ab3411a33038d0c6f862dbea0a2c45.json');
          xhr.responseType = 'json';
          xhr.onload = function(e) {
            if (this.status === 200) {
              res({ru: xhr.response});
            } else {
              rej(e);
            }
          };
          xhr.send();
        });</script>
  
  
  <script src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/gpt.js" async=""></script>
  <style>.grecaptcha-badge{visibility: hidden;}</style>
  <meta name="habr-version" content="2.45.0">
  
  <meta data-vue-meta="ssr" property="fb:app_id" content="444736788986613"><meta data-vue-meta="ssr" property="fb:pages" content="472597926099084"><meta data-vue-meta="ssr" name="twitter:card" content="summary_large_image"><meta data-vue-meta="ssr" name="twitter:site" content="@habr_eng"><meta data-vue-meta="ssr" property="og:locale" content="ru_RU" data-vmid="og:locale">
  
  <meta name="apple-mobile-web-app-status-bar-style" content="#303b44">
  <meta name="msapplication-TileColor" content="#629FBC">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="mobile-web-app-capable" content="yes">
  <link rel="shortcut icon" type="image/png" sizes="16x16" href="https://assets.habr.com/habr-web/img/favicons/favicon-16.png">
  <link rel="shortcut icon" type="image/png" sizes="32x32" href="https://assets.habr.com/habr-web/img/favicons/favicon-32.png">
  <link rel="apple-touch-icon" type="image/png" sizes="76x76" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-76.png">
  <link rel="apple-touch-icon" type="image/png" sizes="120x120" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-120.png">
  <link rel="apple-touch-icon" type="image/png" sizes="152x152" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-152.png">
  <link rel="apple-touch-icon" type="image/png" sizes="180x180" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-180.png">
  <link rel="apple-touch-icon" type="image/png" sizes="256x256" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-256.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_1136x640.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2436x1125.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_1792x828.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_828x1792.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_1334x750.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1242x2668.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2208x1242.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1125x2436.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1242x2208.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2732x2048.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2688x1242.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2224x1668.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_750x1334.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_2048x2732.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2388x1668.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1668x2224.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_640x1136.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1668x2388.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="https://assets.habr.com/habr-web/img/splashes/splash_2048x1536.png">
  <link rel="apple-touch-startup-image" media="screen and (device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="https://assets.habr.com/habr-web/img/splashes/splash_1536x2048.png">
  <link rel="mask-icon" color="#77a2b6" href="https://assets.habr.com/habr-web/img/favicons/apple-touch-icon-120.svg">
  <link crossorigin="use-credentials" href="https://habr.com/manifest.webmanifest" rel="manifest">
<script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-2d0e544c.95c18ea8.js"></script><meta http-equiv="origin-trial" content="A88otRz1Fd3Nt567e2IYshC18LL3KGVXpVJW9oTCId4RYaygt23pbb4JqrbdIO/bwZPWEmRjBIRBu/bZbDR7Pg4AAABueyJvcmlnaW4iOiJodHRwczovL2ltYXNkay5nb29nbGVhcGlzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzVGhpcmRQYXJ0eSI6dHJ1ZX0="><meta http-equiv="origin-trial" content="A0gCLbXCcL0R1Oc8tFPDs0G4Elz17w3zHp+Zst66+D17veE2o7fUcPsA114QtSTRqfVJLMeTSdeWOom0CcyCsgYAAAB7eyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="A9RQ+LxFazAousxUwSCzaihJjHLO1UyjQp0teZKHl7WdbVjPDfHSKMd6D/ZI5MTjqClFycbl70EFd7cBJWXqKQEAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="A6WKeWsdn1Ct+ZPqS9NCxxaiBoQ7wdTkK2/gE69Yu0gfBKJfo1gOvgkGmf5/xaIajT/RUb9AbnF1FsSZ47cCcQcAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2MzQwODMxOTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="A04ZCu7yjrHgwQJK5ISHhH1DSg0qqowEay3n70KO6wV3D2Mj+OX3Kw20aSMitzgdG1xfrN7sOJV/dZIk+RvCzA4AAAB2eyJvcmlnaW4iOiJodHRwczovL2dvb2dsZS5jb206NDQzIiwiZmVhdHVyZSI6IlRydXN0VG9rZW5zIiwiZXhwaXJ5IjoxNjM0MDgzMTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ=="><meta http-equiv="origin-trial" content="A2YAd4xOntTGygIDjApOTtXOgVI3IWsd5OnOGq3RbRkIQwyqYWNl1JGRAcvtm6VOHDj4n07T/J19VqLuJn3MmQ8AAACWeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjMxNjYzOTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9"><meta http-equiv="origin-trial" content="A2c5Ux+hivdkLh/KbZUGr6f7SCR0mZrBVfPJ+/OuDVHNwiYv+Lo83b9z5qL8sod78bQl0pSLtbvRWURo+xRl7AIAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjMxNjYzOTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9"><meta http-equiv="origin-trial" content="AzNJ4sd3tVurolpdvWYZ4cmP9Po7RJhEHSqmC3pgxW9fFVZvchhtcMUgHAs97npxMD1jhXHO8s6q6Wy1MMLxKgEAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjMxNjYzOTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9"><meta http-equiv="origin-trial" content="AwfG8hAcHnPa/kJ1Co0EvG/K0F9l1s2JZGiDLt2mhC3QI5Fh4qmsmSwrWObZFbRC9ieDaSLU6lHRxhGUF/i9sgoAAACBeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="AwQ7dCmHkvR6FuOFxAuNnktYSQrGbL4dF+eBkrwNLALc69Wr//PnO1yzns3pjUoCaYbKHtVcnng2hU+8OUm0PAYAAACHeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><meta http-equiv="origin-trial" content="AysVDPGQTLD/Scn78x4mLwB1tMfje5jwUpAAzGRpWsr1NzoN7MTFhT3ClmImi2svDZA7V6nWGIV8YTPsSRTe0wYAAACHeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"><script src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/pubads_impl_2021082501.js" async=""></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/page-article_sandbox_user-articles-subpages.42ab304e.css"><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/page-article_sandbox_user-articles-subpages.7c1dabd1.js"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/page-article_page-company.c389b18d.css"><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/page-article_page-company.8acf483a.js"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/page-article.5e02c2f9.css"><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/page-article.e4fcd1ed.js"></script><script data-vue-meta="ssr" onload="window[&#39;e0044d29c024&#39;] = true" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/saved_resource" data-vmid="checklogin"></script><script data-vue-meta="ssr" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/ads.js" onload="window[&#39;zhY4i4nJ9K&#39;] = true" data-vmid="checkad"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-f458c7c4.7ecad03c.css"><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-f458c7c4.529673c8.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-2d21ab85.a318b7bd.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/hljs.c67ce31f.js"></script><link rel="stylesheet" type="text/css" href="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/gallery.36fc9d2c.css"><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/gallery.42a5862c.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-2d222042.0248dfe2.js"></script><script charset="utf-8" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/photoswipe.2b48f110.js"></script><link data-vue-meta="ssr" href="https://habr.com/ru/company/ruvds/blog/327754/" rel="canonical" data-vmid="canonical"><link data-vue-meta="ssr" href="https://habr.com/ru/rss/post/327754/?fl=ru" type="application/rss+xml" title="" rel="alternate" name="rss"><link data-vue-meta="ssr" data-vmid="hreflang"><link data-vue-meta="ssr" image_src="image" href="https://habr.com/share/publication/327754/430edeec8a975c0f03e6367015c5f0be/" data-vmid="image:href"><meta data-vue-meta="ssr" property="og:title" content="Bash-скрипты, часть 8: язык обработки данных awk" data-vmid="og:title"><meta data-vue-meta="ssr" name="twitter:title" content="Bash-скрипты, часть 8: язык обработки данных awk" data-vmid="twitter:title"><meta data-vue-meta="ssr" name="aiturec:title" content="Bash-скрипты, часть 8: язык обработки данных awk" data-vmid="aiturec:title"><meta data-vue-meta="ssr" name="description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="description"><meta data-vue-meta="ssr" itemprop="description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="description:itemprop"><meta data-vue-meta="ssr" property="og:description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="og:description"><meta data-vue-meta="ssr" name="twitter:description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="twitter:description"><meta data-vue-meta="ssr" property="aiturec:description" content="Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи,..." data-vmid="aiturec:description"><meta data-vue-meta="ssr" itemprop="image" content="https://habr.com/share/publication/327754/430edeec8a975c0f03e6367015c5f0be/" data-vmid="image:itemprop"><meta data-vue-meta="ssr" property="og:image" content="https://habr.com/share/publication/327754/430edeec8a975c0f03e6367015c5f0be/" data-vmid="og:image"><meta data-vue-meta="ssr" property="aiturec:image" content="https://habr.com/share/publication/327754/430edeec8a975c0f03e6367015c5f0be/" data-vmid="aiturec:image"><meta data-vue-meta="ssr" name="twitter:image" content="https://habr.com/share/publication/327754/430edeec8a975c0f03e6367015c5f0be/" data-vmid="twitter:image"><meta data-vue-meta="ssr" property="vk:image" content="https://habr.com/share/publication/327754/430edeec8a975c0f03e6367015c5f0be/" data-vmid="vk:image"><meta data-vue-meta="ssr" property="aiturec:item_id" content="327754" data-vmid="aiturec:item_id"><meta data-vue-meta="ssr" property="aiturec:datetime" content="2017-05-02T11:04:55.000Z" data-vmid="aiturec:datetime"><meta data-vue-meta="ssr" property="og:type" content="article" data-vmid="og:type"><meta data-vue-meta="ssr" property="og:image:width" content="1200" data-vmid="og:image:width"><meta data-vue-meta="ssr" property="og:image:height" content="630" data-vmid="og:image:height"><script data-vue-meta="ssr" type="application/ld+json" data-vmid="ldjson-schema">{"@context":"http:\/\/schema.org","@type":"Article","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/327754\/"},"headline":"Bash-скрипты, часть 8: язык обработки данных awk","datePublished":"2017-05-02T14:04:55+03:00","dateModified":"2017-05-11T16:01:04+03:00","author":{"@type":"Person","name":"ru_vds"},"publisher":{"@type":"Organization","name":"Habr","logo":{"@type":"ImageObject","url":"https:\/\/habrastorage.org\/webt\/a_\/lk\/9m\/a_lk9mjkccjox-zccjrpfolmkmq.png"}},"description":"Bash-скрипты: начало Bash-скрипты, часть 2: циклы Bash-скрипты, часть 3: параметры и ключи командной строки Bash-скрипты, часть 4: ввод и вывод Bash-скрипты, час...","url":"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/327754\/#post-content-body","about":["c_ruvds","h_linux","h_sys_admin","f_admin"],"image":["https:\/\/habrastorage.org\/files\/803\/892\/bfe\/803892bfe548499aa763df324d40fd01.png","https:\/\/habrastorage.org\/files\/1ba\/550\/d25\/1ba550d25e8846ce8805de564da6aa63.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5a1\/9a9\/4ca\/5a19a94cad5893fc2194fb599cad5422.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/cf0\/b80\/d4a\/cf0b80d4a6ddb34d0b2f15c7ea54557a.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2bf\/803\/3b1\/2bf8033b122fdf3960311ebb80a67779.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a8c\/5b9\/292\/a8c5b92921519f181cd5b2383956ffcb.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b0b\/532\/a2f\/b0b532a2f0c6597bb533bda90c747217.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c50\/282\/673\/c50282673675bee9a49dfd9b6dfe32ea.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a32\/206\/c12\/a32206c12e4c7628696cb62aed26b775.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/109\/070\/4fb\/1090704fb0f7853ce09f4fdc7d813c9d.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a92\/f85\/5d8\/a92f855d88053f7a0538abc1c3b57600.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b9b\/46c\/4ae\/b9b46c4ae70cc3c2cb2db7107dcdf48e.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5f0\/3e5\/28d\/5f03e528de8e4355a16769871035e46d.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2e8\/15a\/bfd\/2e815abfd2b87f1a83cbebddba6d4d19.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/94a\/e22\/cac\/94ae22cacf533cf05ce5a8c6cbb0d816.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/50c\/b55\/80e\/50cb5580ee7438efd090b326d5af3a15.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/619\/da6\/d74\/619da6d74f1e59ed5c94800d58b817f2.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/245\/0b2\/528\/2450b252839c00764accd771336fe518.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/981\/4bd\/85c\/9814bd85ce8fc22a2299f3ce35cd813e.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/711\/503\/950\/71150395079a584116811d6635023259.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bfa\/877\/e32\/bfa877e321ef62fba8c76da8e967d751.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8e1\/c0b\/8db\/8e1c0b8db9cffa7428dda1af8bf3ebcb.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/c53\/ec3\/762\/c53ec3762242952c072e9277b5d97593.png","https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e00\/2f0\/a1a\/e002f0a1a7d37436714f9f5fc93c8c73.png","https:\/\/lh5.googleusercontent.com\/qUE7sqkjSz-nGb4j4dYU15V0M9eLPXSuztbbmFCsjPzJEXRL-xosMnw2fdMd_4YAv_5fFnvt3Pijrggt_nt0vmoLzzfycbI8Uhh57lNMPu0TSYN-Y-mTWKozYoxrqy5Uz3jHDkcRnumMMnQUkw","https:\/\/lh3.googleusercontent.com\/0VV0H2jGWnzz9I7z7GaQskjeH7qhM06ut-ssXOOA0HODAF5Tp801r9YD7j2xLQlAtJpBUwGkacfB7tz2SH4ZFcR2j-zRl6KNUZMGhVeZgv8t2PEvK2r4CQ8DfLkYGqf7_RJRtrYj20i-NMKn3w","https:\/\/lh3.googleusercontent.com\/hmsFRQrUjqzTNGTmOf42XfHPjerCVY3y8EWViFKrXFBkugCrKSmgz0ei_JK3LSkOfqQDgok0iqOGgRk3LUKdhbLXNP_7iyxjOe_2hi-iObr1QxrMIWkWvYizkxUPXTiirZetpmn4vL2kBqFHvg","https:\/\/lh6.googleusercontent.com\/32PdPiqkHvNTKbPq6tfVcEyb9se3YI54X_UA2yJbOWlJ5KYJfxTFTWTaXALHOIWO-WD5Bn79Q7b0c6wW6gUnL83WaqKxMvv8z3OGeZh5WEiLRbEYK0DHXfUtQMSPkykZsOhIpH5M2-wARhCvYw","https:\/\/lh6.googleusercontent.com\/wFI2nUqVLj0duMPEafJs2MtGk7oETB1zCsm53GTzG30l5UjYDWb3igdtB_DULzzN8Mu40_XdSUoZj9egx-nCl11ct_-hcukCfcAVQ-CvD5qUCflo_h8CfVYvNZyWG6DNRJOg4QWW_huMOioX9Q","https:\/\/lh4.googleusercontent.com\/1ef4HRdqEbczINRJIehv3fZ4737nmYjqj7BcDKnEIw9oQlV_KQEbn2QSGXsCT79jV6AHJify_Ik0RtTQiXTlO802hycQdkx4dLN_nJV4AeRX-zsGsu8JUSKszyfxZUq2daDZ-fYd752qViDdFQ","https:\/\/lh5.googleusercontent.com\/BTkYWVuNkMUnAHf4hA1ZksVnjTd68TMa6Drb04hnCqa8IxjR4TBTyA_r6u5CNz6fWCEy32nJIOV9J4Aj1gFqDXaeL8IjOZD76aj4cOBTfUi_Zp6kjlQ_LzoFFDiRV8NWuTVmV5bnJtn-9yHvqA","https:\/\/habrastorage.org\/files\/1ba\/550\/d25\/1ba550d25e8846ce8805de564da6aa63.png"]}</script></head>
<body cz-shortcut-listen="true">


<div id="app" data-async-called="true"><div class="tm-layout__wrapper"><!----><div></div><!----><header class="tm-header"><div class="tm-page-width"><div class="tm-header__container"><!----><span class="tm-header__logo-wrap"><a href="https://habr.com/ru/" class="tm-header__logo tm-header__logo_ru"><svg height="16" width="16" class="tm-svg-img tm-header__icon"><title>Хабр</title><use xlink:href="/img/habr-logo-ru.svg#logo"></use></svg></a><span class="tm-header__beta-sign" style="display: none;">β</span></span><div class="tm-dropdown tm-header__projects"><div class="tm-dropdown__head"><button class="tm-header__dropdown-toggle"><svg height="16" width="16" class="tm-svg-img tm-header__icon tm-header__icon_dropdown"><title>Открыть список</title><use xlink:href="/img/megazord-v24.cee85629.svg#arrow-down"></use></svg></button></div><!----></div><a href="https://habr.com/ru/sandbox/start/" class="tm-header__become-author-btn">
              Как стать автором
            </a><!----><!----><div class="tm-header-user-menu tm-header_user-menu"><a href="https://habr.com/ru/search/" class="tm-header-user-menu__item tm-header-user-menu__search"><svg height="24" width="24" class="tm-svg-img tm-header-user-menu__icon tm-header-user-menu__icon_search"><title>Поиск</title><use xlink:href="/img/megazord-v24.cee85629.svg#search"></use></svg></a><!----><!----><!----><div class="tm-header-user-menu__item"><button data-test-id="menu-toggle-guest" class="tm-header-user-menu__toggle"><svg height="24" width="24" class="tm-svg-img tm-header-user-menu__icon tm-header-user-menu__icon_white"><title>Профиль</title><use xlink:href="/img/megazord-v24.cee85629.svg#header-user"></use></svg></button><!----></div><!----></div></div></div></header><div class="tm-layout"><div class="tm-page-progress-bar"></div><div class="tm-base-layout__header"><div class="tm-page-width"><div class="tm-base-layout__header-wrapper"><div class="tm-main-menu"><div class="tm-main-menu__section"><nav class="tm-main-menu__section-content"><!----><a href="https://habr.com/ru/all/" class="tm-main-menu__item">
        Все потоки
      </a><a href="https://habr.com/ru/flows/develop/" class="tm-main-menu__item">
          Разработка
        </a><a href="https://habr.com/ru/flows/admin/" class="tm-main-menu__item">
          Администрирование
        </a><a href="https://habr.com/ru/flows/design/" class="tm-main-menu__item">
          Дизайн
        </a><a href="https://habr.com/ru/flows/management/" class="tm-main-menu__item">
          Менеджмент
        </a><a href="https://habr.com/ru/flows/marketing/" class="tm-main-menu__item">
          Маркетинг
        </a><a href="https://habr.com/ru/flows/popsci/" class="tm-main-menu__item">
          Научпоп
        </a></nav></div></div><!----></div></div></div><!----><div class="tm-page-width tm-page-width_no-padding"></div><main class="tm-layout__container"><div class="tm-page" hl="ru" companyname="ruvds"><div class="tm-page-width tm-page-width_no-padding"><div class="tm-page__header"><div class="tm-company-card__branding"><!----><a href="https://ruvds.com/ru-rub"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/b778d5a41f83016379c6630262c3294c.png" width="100%" class="tm-company-card__branding-image"></a></div></div><div class="tm-page__wrapper"><div class="tm-page__main tm-page__main_has-sidebar"><div class="pull-down"><div class="pull-down__header" style="height: 0px;"><div class="pull-down__content" style="bottom: 10px;"><svg height="24" width="24" class="tm-svg-img pull-down__arrow"><title>Обновить</title><use xlink:href="/img/megazord-v24.cee85629.svg#pull-arrow"></use></svg></div></div><!----><div class="tm-page-article__body"><article class="tm-page-article__content tm-page-article__content_inner"><div class="tm-page-article__head-wrapper"><!----><div class="tm-article-snippet tm-page-article__snippet"><div class="tm-article-snippet__meta-container"><div class="tm-article-snippet__meta"><span class="tm-user-info tm-article-snippet__author"><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-info__userpic" title="ru_vds"><div class="tm-entity-image"><img alt="" height="24" loading="lazy" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/e36812d3de38eb3d479d7a13228717ef.png" width="24" class="tm-entity-image__pic"></div></a><span class="tm-user-info__user"><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-info__username">
      ru_vds
    </a></span></span><span class="tm-article-snippet__datetime-published"><time datetime="2017-05-02T11:04:55.000Z" title="2017-05-02, 18:04">2  мая  2017 в 18:04</time></span></div><!----></div><h1 lang="ru" class="tm-article-snippet__title tm-article-snippet__title_h1"><span>Bash-скрипты, часть 8: язык обработки данных awk</span></h1><div class="tm-article-snippet__hubs"><span class="tm-article-snippet__hubs-item"><a href="https://habr.com/ru/company/ruvds/blog/" class="tm-article-snippet__hubs-item-link router-link-active"><span>Блог компании RUVDS.com</span><!----></a></span><span class="tm-article-snippet__hubs-item"><a href="https://habr.com/ru/hub/linux/" class="tm-article-snippet__hubs-item-link"><span>Настройка Linux</span><span title="Профильный хаб" class="tm-article-snippet__profiled-hub">*</span></a></span><span class="tm-article-snippet__hubs-item"><a href="https://habr.com/ru/hub/sys_admin/" class="tm-article-snippet__hubs-item-link"><span>Системное администрирование</span><span title="Профильный хаб" class="tm-article-snippet__profiled-hub">*</span></a></span></div><div class="tm-article-snippet__labels"><div class="tm-article-snippet__label"><span>
          Перевод
        </span></div></div><!----><!----></div></div><div class="tm-page-article__origin"><a href="https://likegeeks.com/awk-command/" target="_blank" class="tm-page-article__origin-link">
                Автор оригинала:
                <span class="tm-page-article__origin-value">
                  Администратор likegeeks.com
                </span></a></div><div data-gallery-root="" class="tm-article-body" lang="ru"><div class="article-formatted-body article-formatted-body_version-1" id="post-content-body"><div xmlns="http://www.w3.org/1999/xhtml"><blockquote><a href="https://habrahabr.ru/company/ruvds/blog/325522/">Bash-скрипты: начало</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/325928/">Bash-скрипты, часть 2: циклы</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/326328/">Bash-скрипты, часть 3: параметры и ключи командной строки</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/326594/">Bash-скрипты, часть 4: ввод и вывод</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/326826/">Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327248/">Bash-скрипты, часть 6: функции и разработка библиотек</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327530/">Bash-скрипты, часть 7: sed и обработка текстов</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327754/">Bash-скрипты, часть 8: язык обработки данных awk</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327896/">Bash-скрипты, часть 9: регулярные выражения</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/328346/">Bash-скрипты, часть 10: практические примеры</a><br>
<a href="https://habrahabr.ru/company/ruvds/blog/328436/">Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит</a></blockquote><br>
<a href="https://habrahabr.ru/company/ruvds/blog/327754/"><img data-src="https://habrastorage.org/files/803/892/bfe/803892bfe548499aa763df324d40fd01.png" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/803892bfe548499aa763df324d40fd01.png"></a><br>
<br>
В прошлый раз мы говорили о потоковом редакторе <a href="https://habrahabr.ru/company/ruvds/blog/327530/">sed</a> и рассмотрели немало примеров обработки текста с его помощью. Sed способен решать многие задачи, но есть у него и ограничения. Иногда нужен более совершенный инструмент для обработки данных, нечто вроде языка программирования. Собственно говоря, такой инструмент — awk.<br>
<a name="habracut"></a><br>
<a href="https://ruvds.com/ru-rub/#order"><img data-src="https://habrastorage.org/files/1ba/550/d25/1ba550d25e8846ce8805de564da6aa63.png" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/1ba550d25e8846ce8805de564da6aa63.png"></a><br>
<br>
Утилита awk, или точнее GNU awk, в сравнении с sed, выводит обработку потоков данных на более высокий уровень. Благодаря awk в нашем распоряжении оказывается язык программирования, а не довольно скромный набор команд, отдаваемых редактору. С помощью языка программирования awk можно выполнять следующие действия:<br>
<br>
<ul>
<li>Объявлять переменные для хранения данных.</li>
<li>Использовать арифметические и строковые операторы для работы с данными.</li>
<li>Использовать структурные элементы и управляющие конструкции языка, такие, как оператор if-then и циклы, что позволяет реализовать сложные алгоритмы обработки данных.<br>
</li>
<li>Создавать форматированные отчёты.</li>
</ul><br>
Если говорить лишь о возможности создавать форматированные отчёты, которые удобно читать и анализировать, то это оказывается очень кстати при работе с лог-файлами, которые могут содержать миллионы записей. Но awk — это намного больше, чем средство подготовки отчётов.<br>
<br>
<h2><font color="#3AC1EF">Особенности вызова awk</font></h2><br>
Схема вызова awk выглядит так:<br>
<br>
<pre><code class="hljs delphi">$ awk options <span class="hljs-keyword">program</span> <span class="hljs-keyword">file</span></code></pre><br>
Awk воспринимает поступающие к нему данные в виде набора записей. Записи представляют собой наборы полей. Упрощенно, если не учитывать возможности настройки awk и говорить о некоем вполне обычном тексте, строки которого разделены символами перевода строки, запись — это строка. Поле — это слово в строке.<br>
<br>
Рассмотрим наиболее часто используемые ключи командной строки awk:<br>
<br>
<blockquote><code>-F fs</code> — позволяет указать символ-разделитель для полей в записи.<br>
<code>-f file</code> — указывает имя файла, из которого нужно прочесть awk-скрипт.<br>
<code>-v var=value — </code>позволяет объявить переменную и задать её значение по умолчанию, которое будет использовать awk.<br>
<code>-mf N</code> — задаёт максимальное число полей для обработки в файле данных.<br>
<code>-mr N — </code>задаёт максимальный размер записи в файле данных.<br>
<code>-W keyword</code> — позволяет задать режим совместимости или уровень выдачи предупреждений awk.</blockquote><br>
Настоящая мощь awk скрывается в той части команды его вызова, которая помечена выше как <code>program</code>. Она указывает на файл awk-скрипта, написанный программистом и предназначенный для чтения данных, их обработки и вывода результатов.<br>
<br>
<h2><font color="#3AC1EF">Чтение awk-скриптов из командной строки</font></h2><br>
Скрипты awk, которые можно писать прямо в командной строке, оформляются в виде текстов команд, заключённых в фигурные скобки. Кроме того, так как awk предполагает, что скрипт представляет собой текстовую строку, его нужно заключить в одинарные кавычки:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-string">'{print "Welcome to awk command tutorial"}'</span></code></pre><br>
Запустим эту команду… И ничего не произойдёт Дело тут в том, что мы, при вызове awk, не указали файл с данными. В подобной ситуации awk ожидает поступления данных из <a href="https://habrahabr.ru/company/ruvds/blog/326594/">STDIN</a>. Поэтому выполнение такой команды не приводит к немедленно наблюдаемым эффектам, но это не значит, что awk не работает — он ждёт входных данных из <code>STDIN</code>.<br>
<br>
Если теперь ввести что-нибудь в консоль и нажать <code>Enter</code>, awk обработает введённые данные с помощью скрипта, заданного при его запуске. Awk обрабатывает текст из потока ввода построчно, этим он похож на sed. В нашем случае awk ничего не делает с данными, он лишь, в ответ на каждую новую полученную им строку, выводит на экран текст, заданный в команде <code>print</code>.<br>
<br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/5a1/9a9/4ca/5a19a94cad5893fc2194fb599cad5422.png"></div><br>
<i><font color="#999999">Первый запуск awk, вывод на экран заданного текста</font></i><br>
<br>
Что бы мы ни ввели, результат в данном случае будет одним и тем же — вывод текста.<br>
Для того, чтобы завершить работу awk, нужно передать ему символ конца файла (EOF, End-of-File). Сделать это можно, воспользовавшись сочетанием клавиш <code>CTRL + D</code>.<br>
<br>
Неудивительно, если этот первый пример показался вам не особо впечатляющим. Однако, самое интересное — впереди.<br>
<br>
<h2><font color="#3AC1EF">Позиционные переменные, хранящие данные полей</font></h2><br>
Одна из основных функций awk заключается в возможности манипулировать данными в текстовых файлах. Делается это путём автоматического назначения переменной каждому элементу в строке. По умолчанию awk назначает следующие переменные каждому полю данных, обнаруженному им в записи:<br>
<br>
<ul>
<li><code>$0 — </code>представляет всю строку текста (запись).</li>
<li><code>$1 — </code>первое поле.</li>
<li><code>$2 — </code>второе поле.</li>
<li><code>$n — </code>n-ное поле.</li>
</ul><br>
Поля выделяются из текста с использованием символа-разделителя. По умолчанию — это пробельные символы вроде пробела или символа табуляции.<br>
<br>
Рассмотрим использование этих переменных на простом примере. А именно, обработаем файл, в котором содержится несколько строк (этот файл показан на рисунке ниже) с помощью такой команды:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'{print <span class="hljs-subst">$1</span>}'</span> myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/cf0/b80/d4a/cf0b80d4a6ddb34d0b2f15c7ea54557a.png"></div><br>
<i><font color="#999999">Вывод в консоль первого поля каждой строки</font></i><br>
<br>
Здесь использована переменная <code>$1</code>, которая позволяет получить доступ к первому полю каждой строки и вывести его на экран.<br>
<br>
Иногда в некоторых файлах в качестве разделителей полей используется что-то, отличающееся от пробелов или символов табуляции. Выше мы упоминали ключ awk <code>-F</code>, который позволяет задать необходимый для обработки конкретного файла разделитель:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-operator">-F</span>: <span class="hljs-string">'{print $1}'</span> /etc/passwd</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/2bf/803/3b1/2bf8033b122fdf3960311ebb80a67779.png"></div><br>
<i><font color="#999999">Указание символа-разделителя при вызове awk</font></i><br>
<br>
Эта команда выводит первые элементы строк, содержащихся в файле <code>/etc/passwd</code>. Так как в этом файле в качестве разделителей используются двоеточия, именно этот символ был передан awk после ключа <code>-F</code>.<br>
<br>
<h2><font color="#3AC1EF">Использование нескольких команд</font></h2><br>
Вызов awk с одной командой обработки текста — подход очень ограниченный. Awk позволяет обрабатывать данные с использованием многострочных скриптов. Для того, чтобы передать awk многострочную команду при вызове его из консоли, нужно разделить её части точкой с запятой:<br>
<br>
<pre><code class="hljs dart">$ echo <span class="hljs-string">"My name is Tom"</span> | awk <span class="hljs-string">'{<span class="hljs-subst">$4</span>="Adam"; print <span class="hljs-subst">$0</span>}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/a8c/5b9/292/a8c5b92921519f181cd5b2383956ffcb.png"></div><br>
<i><font color="#999999">Вызов awk из командной строки с передачей ему многострочного скрипта</font></i><br>
<br>
В данном примере первая команда записывает новое значение в переменную <code>$4</code>, а вторая выводит на экран всю строку.<br>
<br>
<h2><font color="#3AC1EF">Чтение скрипта awk из файла</font></h2><br>
Awk позволяет хранить скрипты в файлах и ссылаться на них, используя ключ<code> -f</code>. Подготовим файл <code>testfile</code>, в который запишем следующее:<br>
<br>
<pre><code class="hljs bash">{<span class="hljs-built_in">print</span> <span class="hljs-variable">$1</span> <span class="hljs-string">" has a &nbsp;home directory at "</span> <span class="hljs-variable">$6</span>}</code></pre><br>
Вызовем awk, указав этот файл в качестве источника команд:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-operator">-F</span>: <span class="hljs-operator">-f</span> testfile /etc/passwd</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/b0b/532/a2f/b0b532a2f0c6597bb533bda90c747217.png"></div><br>
<i><font color="#999999">Вызов awk с указанием файла скрипта</font></i><br>
<br>
Тут мы выводим из файла <code>/etc/passwd</code> имена пользователей, которые попадают в переменную <code>$1</code>, и их домашние директории, которые попадают в <code>$6</code>. Обратите внимание на то, что файл скрипта задают с помощью ключа <code>-f</code>, а разделитель полей, двоеточие в нашем случае, с помощью ключа <code>-F</code>.<br>
<br>
В файле скрипта может содержаться множество команд, при этом каждую из них достаточно записывать с новой строки, ставить после каждой точку с запятой не требуется.<br>
Вот как это может выглядеть:<br>
<br>
<pre><code class="hljs mel">{
<span class="hljs-keyword">text</span> = <span class="hljs-string">" has a &nbsp;home directory at "</span>
<span class="hljs-keyword">print</span> $1 <span class="hljs-keyword">text</span> $6
}</code></pre><br>
Тут мы храним текст, используемый при выводе данных, полученных из каждой строки обрабатываемого файла, в переменной, и используем эту переменную в команде <code>print</code>. Если воспроизвести предыдущий пример, записав этот код в файл <code>testfile</code>, выведено будет то же самое.<br>
<br>
<h2><font color="#3AC1EF">Выполнение команд до начала обработки данных</font></h2><br>
Иногда нужно выполнить какие-то действия до того, как скрипт начнёт обработку записей из входного потока. Например — создать шапку отчёта или что-то подобное.<br>
<br>
Для этого можно воспользоваться ключевым словом <code>BEGIN</code>. Команды, которые следуют за <code>BEGIN</code>, будут исполнены до начала обработки данных. В простейшем виде это выглядит так:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-string">'BEGIN {print "Hello World!"}'</span></code></pre><br>
А вот — немного более сложный пример:<br>
<br>
<pre><code class="hljs swift">$ awk '<span class="hljs-type">BEGIN</span> {<span class="hljs-built_in">print</span> <span class="hljs-string">"The File Contents:"</span>}
{<span class="hljs-built_in">print</span> $<span class="hljs-number">0</span>}' myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/c50/282/673/c50282673675bee9a49dfd9b6dfe32ea.png"></div><br>
<i><font color="#999999">Выполнение команд до начала обработки данных</font></i><br>
<br>
Сначала awk исполняет блок <code>BEGIN</code>, после чего выполняется обработка данных. Будьте внимательны с одинарными кавычками, используя подобные конструкции в командной строке. Обратите внимание на то, что и блок <code>BEGIN</code>, и команды обработки потока, являются в представлении awk одной строкой. Первая одинарная кавычка, ограничивающая эту строку, стоит перед <code>BEGIN</code>. Вторая — после закрывающей фигурной скобки команды обработки данных.<br>
<br>
<h2><font color="#3AC1EF">Выполнение команд после окончания обработки данных</font></h2><br>
Ключевое слово <code>END</code> позволяет задавать команды, которые надо выполнить после окончания обработки данных:<br>
<br>
<pre><code class="hljs swift">$ awk '<span class="hljs-type">BEGIN</span> {<span class="hljs-built_in">print</span> <span class="hljs-string">"The File Contents:"</span>}
{<span class="hljs-built_in">print</span> $<span class="hljs-number">0</span>}
<span class="hljs-type">END</span> {<span class="hljs-built_in">print</span> <span class="hljs-string">"End of File"</span>}' myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/a32/206/c12/a32206c12e4c7628696cb62aed26b775.png"></div><br>
<i>Результаты работы скрипта, в котором имеются блоки BEGIN и END</i><br>
<br>
После завершения вывода содержимого файла, awk выполняет команды блока <code>END</code>. Это полезная возможность, с её помощью, например, можно сформировать подвал отчёта. Теперь напишем скрипт следующего содержания и сохраним его в файле <code>myscript</code>:<br>
<br>
<pre><code class="hljs bash">BEGIN {
<span class="hljs-built_in">print</span> <span class="hljs-string">"The latest list of users and shells"</span>
<span class="hljs-built_in">print</span> <span class="hljs-string">" UserName \t HomePath"</span>
<span class="hljs-built_in">print</span> <span class="hljs-string">"-------- \t -------"</span>
FS=<span class="hljs-string">":"</span>
}
{
<span class="hljs-built_in">print</span> <span class="hljs-variable">$1</span> <span class="hljs-string">" \t "</span> <span class="hljs-variable">$6</span>
}
END {
<span class="hljs-built_in">print</span> <span class="hljs-string">"The end"</span>
}</code></pre><br>
Тут, в блоке <code>BEGIN</code>, создаётся заголовок табличного отчёта. В этом же разделе мы указываем символ-разделитель. После окончания обработки файла, благодаря блоку <code>END</code>, система сообщит нам о том, что работа окончена.<br>
<br>
Запустим скрипт:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-operator">-f</span> myscript &nbsp;/etc/passwd</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/109/070/4fb/1090704fb0f7853ce09f4fdc7d813c9d.png"></div><br>
<i><font color="#999999">Обработка файла /etc/passwd с помощью awk-скрипта</font></i><br>
<br>
Всё, о чём мы говорили выше — лишь малая часть возможностей awk. Продолжим освоение этого полезного инструмента.<br>
<br>
<h2><font color="#3AC1EF">Встроенные переменные: настройка процесса обработки данных</font></h2><br>
Утилита awk использует встроенные переменные, которые позволяют настраивать процесс обработки данных и дают доступ как к обрабатываемым данным, так и к некоторым сведениям о них.<br>
<br>
Мы уже рассматривали позиционные переменные — <code>$1</code>, <code>$2</code>, <code>$3</code>, которые позволяют извлекать значения полей, работали мы и с некоторыми другими переменными. На самом деле, их довольно много. Вот некоторые из наиболее часто используемых:<br>
<blockquote><code>FIELDWIDTHS — </code>разделённый пробелами список чисел, определяющий точную ширину каждого поля данных с учётом разделителей полей.<br>
<code>FS</code> — уже знакомая вам переменная, позволяющая задавать символ-разделитель полей.<br>
<code>RS — </code>переменная, которая позволяет задавать символ-разделитель записей.<br>
<code>OFS — </code>разделитель полей на выводе awk-скрипта.<br>
<code>ORS — </code>разделитель записей на выводе awk-скрипта.</blockquote><br>
По умолчанию переменная <code>OFS</code> настроена на использование пробела. Её можно установить так, как нужно для целей вывода данных:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'BEGIN{FS=":"; OFS="-"} {print <span class="hljs-subst">$1</span>,<span class="hljs-subst">$6</span>,<span class="hljs-subst">$7</span>}'</span> /etc/passwd</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/a92/f85/5d8/a92f855d88053f7a0538abc1c3b57600.png"></div><br>
<i><font color="#999999">Установка разделителя полей выходного потока</font></i><br>
<br>
Переменная <code>FIELDWIDTHS</code> позволяет читать записи без использования символа-разделителя полей.<br>
<br>
В некоторых случаях, вместо использования разделителя полей, данные в пределах записей расположены в колонках постоянной ширины. В подобных случаях необходимо задать переменную <code>FIELDWIDTHS</code> таким образом, чтобы её содержимое соответствовало особенностям представления данных.<br>
<br>
При установленной переменной <code>FIELDWIDTHS</code> awk будет игнорировать переменную <code>FS</code> и находить поля данных в соответствии со сведениями об их ширине, заданными в <code>FIELDWIDTHS</code>.<br>
<br>
Предположим, имеется файл <code>testfile</code>, содержащий такие данные:<br>
<br>
<pre><code class="hljs yaml"><span class="hljs-number">1235.9652147</span><span class="hljs-number">.91</span>
<span class="hljs-number">927</span><span class="hljs-number">-8.365217</span><span class="hljs-number">.27</span>
<span class="hljs-number">36257.8157492</span><span class="hljs-number">.5</span></code></pre><br>
Известно, что внутренняя организация этих данных соответствует шаблону 3-5-2-5, то есть, первое поле имеет ширину 3 символа, второе — 5, и так далее. Вот скрипт, который позволит разобрать такие записи:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'BEGIN{FIELDWIDTHS="3 5 2 5"}{print <span class="hljs-subst">$1</span>,<span class="hljs-subst">$2</span>,<span class="hljs-subst">$3</span>,<span class="hljs-subst">$4</span>}'</span> testfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/b9b/46c/4ae/b9b46c4ae70cc3c2cb2db7107dcdf48e.png"></div><br>
<i><font color="#999999">Использование переменной FIELDWIDTHS</font></i><br>
<br>
Посмотрим на то, что выведет скрипт. Данные разобраны с учётом значения переменной <code>FIELDWIDTHS</code>, в результате числа и другие символы в строках разбиты в соответствии с заданной шириной полей.<br>
<br>
Переменные <code>RS</code> и <code>ORS</code> задают порядок обработки записей. По умолчанию <code>RS</code> и <code>ORS</code> установлены на символ перевода строки. Это означает, что awk воспринимает каждую новую строку текста как новую запись и выводит каждую запись с новой строки.<br>
<br>
Иногда случается так, что поля в потоке данных распределены по нескольким строкам. Например, пусть имеется такой файл с именем <code>addresses</code>:<br>
<br>
<pre><code class="hljs yaml"><span class="hljs-string">Person</span> <span class="hljs-string">Name</span>
<span class="hljs-number">123</span> <span class="hljs-string">High</span> <span class="hljs-string">Street</span>
<span class="hljs-string">(222)</span> <span class="hljs-number">466</span><span class="hljs-number">-1234</span>

<span class="hljs-string">Another</span> <span class="hljs-string">person</span>
<span class="hljs-number">487</span> <span class="hljs-string">High</span> <span class="hljs-string">Street</span>
<span class="hljs-string">(523)</span> <span class="hljs-number">643</span><span class="hljs-number">-8754</span></code></pre><br>
Если попытаться прочесть эти данные при условии, что <code>FS</code> и <code>RS</code> установлены в значения по умолчанию, awk сочтёт каждую новую строку отдельной записью и выделит поля, опираясь на пробелы. Это не то, что нам в данном случае нужно.<br>
<br>
Для того, чтобы решить эту проблему, в <code>FS</code> надо записать символ перевода строки. Это укажет awk на то, что каждая строка в потоке данных является отдельным полем.<br>
<br>
Кроме того, в данном примере понадобится записать в переменную <code>RS</code> пустую строку. Обратите внимание на то, что в файле блоки данных о разных людях разделены пустой строкой. В результате awk будет считать пустые строки разделителями записей. Вот как всё это сделать:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'BEGIN{FS="\n"; RS=""} {print <span class="hljs-subst">$1</span>,<span class="hljs-subst">$3</span>}'</span> addresses</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/5f0/3e5/28d/5f03e528de8e4355a16769871035e46d.png"></div><br>
<i><font color="#999999">Результаты настройки переменных RS и FS</font></i><br>
<br>
Как видите, awk, благодаря таким настройкам переменных, воспринимает строки из файла как поля, а разделителями записей становятся пустые строки.<br>
<br>
<h2><font color="#3AC1EF">Встроенные переменные: сведения о данных и об окружении</font></h2><br>
Помимо встроенных переменных, о которых мы уже говорили, существуют и другие, которые предоставляют сведения о данных и об окружении, в котором работает awk:<br>
<blockquote><code>ARGC</code> — количество аргументов командной строки.<br>
<code>ARGV</code> — массив с аргументами командной строки.<br>
<code>ARGIND</code> — индекс текущего обрабатываемого файла в массиве <code>ARGV</code>.<br>
<code>ENVIRON</code> — ассоциативный массив с переменными окружения и их значениями.<br>
<code>ERRNO</code> — код системной ошибки, которая может возникнуть при чтении или закрытии входных файлов.<br>
<code>FILENAME</code> — имя входного файла с данными.<br>
<code>FNR</code> — номер текущей записи в файле данных.<br>
<code>IGNORECASE</code> — если эта переменная установлена в ненулевое значение, при обработке игнорируется регистр символов.<br>
<code>NF</code> — общее число полей данных в текущей записи.<br>
<code>NR</code> — общее число обработанных записей.</blockquote><br>
Переменные <code>ARGC</code> и <code>ARGV</code> позволяют работать с аргументами командной строки. При этом скрипт, переданный awk, не попадает в массив аргументов <code>ARGV</code>. Напишем такой скрипт:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-string">'BEGIN{print ARGC,ARGV[1]}'</span> myfile</code></pre><br>
После его запуска можно узнать, что общее число аргументов командной строки — 2, а под индексом 1 в массиве <code>ARGV</code> записано имя обрабатываемого файла. В элементе массива с индексом 0 в данном случае будет «awk».<br>
<br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/2e8/15a/bfd/2e815abfd2b87f1a83cbebddba6d4d19.png"></div><br>
<i><font color="#999999">Работа с параметрами командной строки</font></i><br>
<br>
Переменная <code>ENVIRON</code> представляет собой ассоциативный массив с переменными среды. Опробуем её:<br>
<br>
<pre><code class="hljs swift">$ awk '
<span class="hljs-type">BEGIN</span>{
<span class="hljs-built_in">print</span> <span class="hljs-type">ENVIRON</span>[<span class="hljs-string">"HOME"</span>]
<span class="hljs-built_in">print</span> <span class="hljs-type">ENVIRON</span>[<span class="hljs-string">"PATH"</span>]
}'</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/94a/e22/cac/94ae22cacf533cf05ce5a8c6cbb0d816.png"></div><br>
<i><font color="#999999">Работа с переменными среды</font></i><br>
<br>
Переменные среды можно использовать и без обращения к <code>ENVIRON</code>. Сделать это, например, можно так:<br>
<br>
<pre><code class="hljs bash">$ &nbsp;<span class="hljs-built_in">echo</span> | awk -v home=<span class="hljs-variable">$HOME</span> <span class="hljs-string">'{print "My home is " home}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/50c/b55/80e/50cb5580ee7438efd090b326d5af3a15.png"></div><br>
<i><font color="#999999">Работа с переменными среды без использования ENVIRON</font></i><br>
<br>
Переменная <code>NF</code> позволяет обращаться к последнему полю данных в записи, не зная его точной позиции:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'BEGIN{FS=":"; OFS=":"} {print <span class="hljs-subst">$1</span>,<span class="hljs-subst">$NF</span>}'</span> /etc/passwd</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/619/da6/d74/619da6d74f1e59ed5c94800d58b817f2.png"></div><br>
<i><font color="#999999">Пример использования переменной NF</font></i><br>
<br>
Эта переменная содержит числовой индекс последнего поля данных в записи. Обратиться к данному полю можно, поместив перед <code>NF</code> знак <code>$</code>.<br>
<br>
Переменные <code>FNR</code> и <code>NR</code>, хотя и могут показаться похожими, на самом деле различаются. Так, переменная <code>FNR</code> хранит число записей, обработанных в текущем файле. Переменная <code>NR</code> хранит общее число обработанных записей. Рассмотрим пару примеров, передав awk один и тот же файл дважды:<br>
<br>
<pre><code class="hljs rust">$ awk <span class="hljs-symbol">'BEGIN</span>{FS=<span class="hljs-string">","</span>}{print $<span class="hljs-number">1</span>,<span class="hljs-string">"FNR="</span>FNR}' myfile myfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/245/0b2/528/2450b252839c00764accd771336fe518.png"></div><br>
<i><font color="#999999">Исследование переменной FNR</font></i><br>
<br>
Передача одного и того же файла дважды равносильна передаче двух разных файлов. Обратите внимание на то, что <code>FNR</code> сбрасывается в начале обработки каждого файла.<br>
<br>
Взглянем теперь на то, как ведёт себя в подобной ситуации переменная <code>NR</code>:<br>
<br>
<pre><code class="hljs sql">$ awk '
<span class="hljs-keyword">BEGIN</span> {FS=<span class="hljs-string">","</span>}
{print $<span class="hljs-number">1</span>,<span class="hljs-string">"FNR="</span>FNR,<span class="hljs-string">"NR="</span>NR}
<span class="hljs-keyword">END</span>{print <span class="hljs-string">"There were"</span>,NR,<span class="hljs-string">"records processed"</span>}<span class="hljs-string">' myfile myfile</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/981/4bd/85c/9814bd85ce8fc22a2299f3ce35cd813e.png"></div><br>
<i><font color="#999999">Различие переменных NR и FNR</font></i><br>
<br>
Как видно, <code>FNR</code>, как и в предыдущем примере, сбрасывается в начале обработки каждого файла, а вот <code>NR</code>, при переходе к следующему файлу, сохраняет значение.<br>
<br>
<h2><font color="#3AC1EF">Пользовательские переменные</font></h2><br>
Как и любые другие языки программирования, awk позволяет программисту объявлять переменные. Имена переменных могут включать в себя буквы, цифры, символы подчёркивания. Однако, они не могут начинаться с цифры. Объявить переменную, присвоить ей значение и воспользоваться ей в коде можно так:<br>
<br>
<pre><code class="hljs sql">$ awk '
<span class="hljs-keyword">BEGIN</span>{
<span class="hljs-keyword">test</span>=<span class="hljs-string">"This is a test"</span>
print <span class="hljs-keyword">test</span>
}<span class="hljs-string">'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/711/503/950/71150395079a584116811d6635023259.png"></div><br>
<i><font color="#999999">Работа с пользовательской переменной</font></i><br>
 <br>
<h2><font color="#3AC1EF">Условный оператор</font></h2><br>
Awk поддерживает стандартный во многих языках программирования формат условного оператора <code>if-then-else</code>. Однострочный вариант оператора представляет собой ключевое слово <code>if</code>, за которым, в скобках, записывают проверяемое выражение, а затем — команду, которую нужно выполнить, если выражение истинно.<br>
<br>
Например, есть такой файл с именем <code>testfile</code>:<br>
<br>
<pre><code class="hljs yaml"><span class="hljs-number">10</span>
<span class="hljs-number">15</span>
<span class="hljs-number">6</span>
<span class="hljs-number">33</span>
<span class="hljs-number">45</span></code></pre><br>
Напишем скрипт, который выводит числа из этого файла, большие 20:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'{if (<span class="hljs-subst">$1</span> &gt; 20) print <span class="hljs-subst">$1</span>}'</span> testfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/bfa/877/e32/bfa877e321ef62fba8c76da8e967d751.png"></div><br>
<i><font color="#999999">Однострочный оператор if</font></i><br>
<br>
Если нужно выполнить в блоке <code>if</code> несколько операторов, их нужно заключить в фигурные скобки:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-string">'{
if ($1 &gt; 20)
{
x = $1 * 2
print x
}
}'</span> testfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/8e1/c0b/8db/8e1c0b8db9cffa7428dda1af8bf3ebcb.png"></div><br>
<i><font color="#999999">Выполнение нескольких команд в блоке if</font></i><br>
<br>
Как уже было сказано, условный оператор awk может содержать блок <code>else</code>:<br>
<br>
<pre><code class="hljs dos">$ awk '{
<span class="hljs-keyword">if</span> ($<span class="hljs-number">1</span> &gt; <span class="hljs-number">20</span>)
{
x = $<span class="hljs-number">1</span> * <span class="hljs-number">2</span>
<span class="hljs-built_in">print</span> x
} <span class="hljs-keyword">else</span>
{
x = $<span class="hljs-number">1</span> / <span class="hljs-number">2</span>
<span class="hljs-built_in">print</span> x
}}' testfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/c53/ec3/762/c53ec3762242952c072e9277b5d97593.png"></div><br>
<i><font color="#999999">Условный оператор с блоком else</font></i><br>
<br>
Ветвь <code>else</code> может быть частью однострочной записи условного оператора, включая в себя лишь одну строку с командой. В подобном случае после ветви <code>if</code>, сразу перед <code>else</code>, надо поставить точку с запятой:<br>
<br>
<pre><code class="hljs dart">$ awk <span class="hljs-string">'{if (<span class="hljs-subst">$1</span> &gt; 20) print <span class="hljs-subst">$1</span> * 2; else print <span class="hljs-subst">$1</span> / 2}'</span> testfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/getpro/habr/post_images/e00/2f0/a1a/e002f0a1a7d37436714f9f5fc93c8c73.png"></div><br>
<i><font color="#999999">Условный оператор, содержащий ветви if и else, записанный в одну строку</font></i><br>
 <br>
<h2><font color="#3AC1EF">Цикл while</font></h2><br>
Цикл <code>while</code> позволяет перебирать наборы данных, проверяя условие, которое остановит цикл.<br>
<br>
Вот файл <code>myfile</code>, обработку которого мы хотим организовать с помощью цикла:<br>
<br>
<pre><code class="hljs yaml"><span class="hljs-number">124</span> <span class="hljs-number">127</span> <span class="hljs-number">130</span>
<span class="hljs-number">112</span> <span class="hljs-number">142</span> <span class="hljs-number">135</span>
<span class="hljs-number">175</span> <span class="hljs-number">158</span> <span class="hljs-number">245</span></code></pre><br>
Напишем такой скрипт:<br>
<br>
<pre><code class="hljs swift">$ awk '{
total = <span class="hljs-number">0</span>
i = <span class="hljs-number">1</span>
<span class="hljs-keyword">while</span> (i &lt; <span class="hljs-number">4</span>)
{
total += $i
i++
}
avg = total / <span class="hljs-number">3</span>
<span class="hljs-built_in">print</span> <span class="hljs-string">"Average:"</span>,avg
}' testfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image24.png"></div><br>
<i><font color="#999999">Обработка данных в цикле while</font></i><br>
<br>
Цикл <code>while</code> перебирает поля каждой записи, накапливая их сумму в переменной <code>total</code> и увеличивая в каждой итерации на 1 переменную-счётчик <code>i</code>. Когда <code>i</code> достигнет 4, условие на входе в цикл окажется ложным и цикл завершится, после чего будут выполнены остальные команды — подсчёт среднего значения для числовых полей текущей записи и вывод найденного значения.<br>
<br>
В циклах <code>while</code> можно использовать команды <code>break</code> и <code>continue</code>. Первая позволяет досрочно завершить цикл и приступить к выполнению команд, расположенных после него. Вторая позволяет, не завершая до конца текущую итерацию, перейти к следующей.<br>
<br>
Вот как работает команда <code>break</code>:<br>
<br>
<pre><code class="hljs swift">$ awk '{
total = <span class="hljs-number">0</span>
i = <span class="hljs-number">1</span>
<span class="hljs-keyword">while</span> (i &lt; <span class="hljs-number">4</span>)
{
total += $i
<span class="hljs-keyword">if</span> (i == <span class="hljs-number">2</span>)
<span class="hljs-keyword">break</span>
i++
}
avg = total / <span class="hljs-number">2</span>
<span class="hljs-built_in">print</span> <span class="hljs-string">"The average of the first two elements is:"</span>,avg
}' testfile</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image28.png"></div><br>
<i><font color="#999999">Команда break в цикле while</font></i><br>
 <br>
<h2><font color="#3AC1EF">Цикл for</font></h2><br>
Циклы <code>for</code> используются во множестве языков программировании. Поддерживает их и awk. Решим задачу расчёта среднего значения числовых полей с использованием такого цикла:<br>
<br>
<pre><code class="hljs django"><span class="xml">$ awk '{
total = 0
for (i = 1; i <span class="hljs-tag">&lt; <span class="hljs-attr">4</span>; <span class="hljs-attr">i</span>++)
{
<span class="hljs-attr">total</span> += <span class="hljs-string">$i</span>
}
<span class="hljs-attr">avg</span> = <span class="hljs-string">total</span> / <span class="hljs-attr">3</span>
<span class="hljs-attr">print</span> "<span class="hljs-attr">Average:</span>",<span class="hljs-attr">avg</span>
}' <span class="hljs-attr">testfile</span></span></span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image27.png"></div><br>
<i><font color="#999999">Цикл for</font></i><br>
<br>
Начальное значение переменной-счётчика и правило её изменения в каждой итерации, а также условие прекращения цикла, задаются в начале цикла, в круглых скобках. В итоге нам не нужно, в отличие от случая с циклом <code>while</code>, самостоятельно инкрементировать счётчик.<br>
<br>
<h2><font color="#3AC1EF">Форматированный вывод данных</font></h2><br>
Команда <code>printf</code> в awk позволяет выводить форматированные данные. Она даёт возможность настраивать внешний вид выводимых данных благодаря использованию шаблонов, в которых могут содержаться текстовые данные и спецификаторы форматирования.<br>
<br>
Спецификатор форматирования — это специальный символ, который задаёт тип выводимых данных и то, как именно их нужно выводить. Awk использует спецификаторы форматирования как указатели мест вставки данных из переменных, передаваемых <code>printf</code>. <br>
<br>
Первый спецификатор соответствует первой переменной, второй спецификатор — второй, и так далее.<br>
<br>
Спецификаторы форматирования записывают в таком виде:<br>
<br>
<pre><code class="hljs mel">%[modifier]<span class="hljs-keyword">control</span>-letter</code></pre><br>
Вот некоторые из них:<br>
<blockquote><code>c</code> — воспринимает переданное ему число как код ASCII-символа и выводит этот символ.<br>
<code>d</code> — выводит десятичное целое число.<br>
<code>i</code> — то же самое, что и <code>d</code>.<br>
<code>e</code> — выводит число в экспоненциальной форме.<br>
<code>f</code> — выводит число с плавающей запятой.<br>
<code>g</code> — выводит число либо в экспоненциальной записи, либо в формате с плавающей запятой, в зависимости от того, как получается короче.<br>
<code>o</code> — выводит восьмеричное представление числа.<br>
<code>s</code> — выводит текстовую строку.</blockquote><br>
Вот как форматировать выводимые данные с помощью <code>printf</code>:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-string">'BEGIN{
x = 100 * 100
printf "The result is: %e\n", x
}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image23.png"></div><br>
<i><font color="#999999">Форматирование выходных данных с помощью printf</font></i><br>
<br>
Тут, в качестве примера, мы выводим число в экспоненциальной записи. Полагаем, этого достаточно для того, чтобы вы поняли основную идею, на которой построена работа с <code>printf</code>.<br>
<br>
<h2><font color="#3AC1EF">Встроенные математические функции</font></h2><br>
При работе с awk программисту доступны <a href="https://www.gnu.org/software/gawk/manual/html_node/Built_002din.html#Built_002din">встроенные функции</a>. В частности, это математические и строковые функции, функции для работы со временем. Вот, например, список математических функций, которыми можно пользоваться при разработке awk-скриптов:<br>
<blockquote><code>cos(x)</code> — косинус <code>x</code> (<code>x</code> выражено в радианах).<br>
<code>sin(x)</code> — синус <code>x</code>.<br>
<code>exp(x)</code> — экспоненциальная функция.<br>
<code>int(x)</code> — возвращает целую часть аргумента.<br>
<code>log(x)</code> — натуральный логарифм.<br>
<code>rand()</code> — возвращает случайное число с плавающей запятой в диапазоне 0 — 1.<br>
<code>sqrt(x)</code> — квадратный корень из <code>x</code>.</blockquote><br>
Вот как пользоваться этими функциями:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-string">'BEGIN{x=exp(5); print x}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image21.png"></div><br>
<i><font color="#999999">Работа с математическими функциями</font></i><br>
 <br>
<h2><font color="#3AC1EF">Строковые функции</font></h2><br>
Awk поддерживает множество <a href="https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions">строковых функций</a>. Все они устроены более или менее одинаково. Вот, например, функция <code>toupper</code>:<br>
<br>
<pre><code class="hljs powershell"><span class="hljs-variable">$</span> awk <span class="hljs-string">'BEGIN{x = "likegeeks"; print toupper(x)}'</span></code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image25.png"></div><br>
<i>Использование строковой функции toupper</i><br>
<br>
Эта функция преобразует символы, хранящиеся в переданной ей строковой переменной, к верхнему регистру.<br>
<br>
<h2><font color="#3AC1EF">Пользовательские функции</font></h2><br>
При необходимости вы можете создавать собственные функции awk. Такие функции можно использовать так же, как встроенные:<br>
<br>
<pre><code class="hljs cmake">$ awk '
<span class="hljs-keyword">function</span> myprint()
{
printf <span class="hljs-string">"The user %s has home path at %s\n"</span>, $<span class="hljs-number">1</span>,$<span class="hljs-number">6</span>
}
BEGIN{FS=<span class="hljs-string">":"</span>}
{
myprint()
}' /etc/passwd</code></pre><br>
<div style="text-align:center;"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image29.png"></div><br>
<i>Использование собственной функции</i><br>
<br>
В примере используется заданная нами функция <code>myprint</code>, которая выводит данные.<br>
<br>
<h2><font color="#3AC1EF">Итоги</font></h2><br>
Сегодня мы разобрали основы awk. Это мощнейший инструмент обработки данных, масштабы которого сопоставимы с отдельным языком программирования.<br>
<br>
Вы не могли не заметить, что многое из того, о чём мы говорим, не так уж и сложно для понимания, а зная основы, уже можно что-то автоматизировать, но если копнуть поглубже, вникнуть в документацию… Вот, например, <a href="https://www.gnu.org/software/gawk/manual/html_node/index.html">The GNU Awk User’s Guide</a>. В этом руководстве впечатляет уже одно то, что оно ведёт свою историю с 1989-го (первая версия awk, кстати, появилась в 1977-м). Однако, сейчас вы знаете об awk достаточно для того, чтобы не потеряться в официальной документации и познакомиться с ним настолько близко, насколько вам того хочется. В следующий раз, кстати, мы поговорим о регулярных выражениях. Без них невозможно заниматься серьёзной обработкой текстов в bash-скриптах с применением sed и awk.<br>
<br>
<a href="https://ruvds.com/ru-rub/#order"><img src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/image-loader.svg" data-src="https://habrastorage.org/files/1ba/550/d25/1ba550d25e8846ce8805de564da6aa63.png"></a><br>
<br>
Уважаемые читатели! Уверены, многие из вас периодически пользуются awk. Расскажите, как он помогает вам в работе?</div></div><div aria-hidden="true" role="dialog" tabindex="-1" class="pswp"><div class="pswp__bg"></div><div class="pswp__scroll-wrap"><div class="pswp__container"><div class="pswp__item"></div><div class="pswp__item"></div><div class="pswp__item"></div></div><div class="pswp__ui pswp__ui--hidden"><div class="pswp__top-bar"><span class="tm-svg-icon__wrapper pswp__button pswp__button--close"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Закрыть</title><use xlink:href="/img/megazord-v24.cee85629.svg#close"></use></svg></span><div class="pswp__preloader"><div class="pswp__preloader__icn"><div class="pswp__preloader__cut"><div class="pswp__preloader__donut"></div></div></div></div></div></div></div></div><!----></div><div class="tm-article-body__tags"><div class="tm-article-body__tags-links"><span class="tm-article-body__tags-title">Теги:</span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BRuVDS%5D" class="tm-article-body__tags-item-link">RuVDS</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BLinux%5D" class="tm-article-body__tags-item-link">Linux</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BBash%5D" class="tm-article-body__tags-item-link">Bash</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5B%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B9%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%5D" class="tm-article-body__tags-item-link">сценарий командной строки</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5BBash-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%5D" class="tm-article-body__tags-item-link">Bash-скрипт</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5Bawk%5D" class="tm-article-body__tags-item-link">awk</a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5B%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%5D" class="tm-article-body__tags-item-link">обработка текстов</a></span></div><div class="tm-article-body__tags-links"><span class="tm-article-body__tags-title">Хабы:</span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/company/ruvds/blog/" class="tm-article-body__tags-item-link router-link-active">
                  Блог компании RUVDS.com
                </a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/hub/linux/" class="tm-article-body__tags-item-link">
                  Настройка Linux
                </a></span><span class="tm-article-body__tags-item"><a href="https://habr.com/ru/hub/sys_admin/" class="tm-article-body__tags-item-link">
                  Системное администрирование
                </a></span></div></div></article><div class="tm-article__icons-wrapper" style="display: none;"><div class="tm-data-icons tm-page-article__counters-panel"><div class="tm-article-rating tm-data-icons__item"><div class="tm-votes-meter tm-article-rating__votes-switcher"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_medium"><title>Всего голосов 30: ↑27 и ↓3</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 30: ↑27 и ↓3" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_medium">+24</span></div><div class="v-portal" style="display: none;"></div></div><!----><!----><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    377
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/327754/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      18
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/327754/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +18
    </span></a></div><div class="tm-sharing tm-data-icons__item" title="Поделиться"><button type="button" class="tm-sharing__button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="tm-sharing__icon"><path fill="currentColor" d="M10.33.275l9.047 7.572a.2.2 0 010 .306l-9.048 7.572a.2.2 0 01-.328-.153V11c-8 0-9.94 6-9.94 6S-1 5 10 5V.428a.2.2 0 01.328-.153z"></path></svg></button><!----></div><div class="v-portal" style="display: none;"></div></div></div><!----></div><!----><div class="tm-page-article__additional-blocks"><div class="tm-editoral-subscription"><span class="tm-svg-icon__wrapper tm-editoral-subscription__close"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Закрыть</title><use xlink:href="/img/megazord-v24.cee85629.svg#close"></use></svg></span><h3 class="tm-editoral-subscription__title">
    Редакторский дайджест
  </h3><p class="tm-editoral-subscription__description">
    Присылаем лучшие статьи раз&nbsp;в&nbsp;месяц
  </p><form method="GET" class="tm-editoral-subscription__form"><div class="tm-input-text-decorated tm-editoral-subscription__input tm-input-text-decorated_has-label-after" name="email" placeholder="Электропочта" type="email"><!----><input name="email" placeholder="Электропочта" type="email" class="tm-input-text-decorated__input"><div class="tm-input-text-decorated__label tm-input-text-decorated__label_after"><button type="submit" class="tm-editoral-subscription__icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class=""><path fill="currentColor" clip-rule="evenodd" d="M19.707 11.293a1 1 0 010 1.414l-5.5 5.5a1 1 0 01-1.414-1.414L16.586 13H5a1 1 0 110-2h11.586l-3.793-3.793a1 1 0 011.414-1.414l5.5 5.5z"></path></svg></button></div></div><!----></form></div><section class="tm-block tm-block_spacing-bottom"><!----><div class="tm-block__body"><div class="tm-article-author tm-page-article__author"><div class="tm-article-author__company"><div class="tm-article-author__company-card"><div class="tm-company-snippet"><a href="https://habr.com/ru/company/ruvds/profile/" class="tm-company-snippet__logo-link"><div class="tm-entity-image"><img alt="" height="40" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/f27ea85bd62fbd985c308110885af7e0.png" width="40" class="tm-entity-image__pic"></div></a><div class="tm-company-snippet__info"><a href="https://habr.com/ru/company/ruvds/profile/" class="tm-company-snippet__title">RUVDS.com</a><div class="tm-company-snippet__description">VDS/VPS-хостинг. Скидка 10% по коду <b>HABR10</b></div></div></div><div class="tm-article-author__buttons"><!----><!----></div></div><div class="tm-article-author__company-contacts"><a href="https://facebook.com/ruvds" rel="noopener" target="_blank" class="tm-article-author__contact">
        Facebook
      </a><a href="https://twitter.com/ru_vds" rel="noopener" target="_blank" class="tm-article-author__contact">
        Twitter
      </a><a href="https://vk.com/ru_vds" rel="noopener" target="_blank" class="tm-article-author__contact">
        ВКонтакте
      </a></div><div class="tm-article-author__separator"></div></div><div class="tm-user-card tm-article-author__user-card tm-user-card_variant-two-column"><div class="tm-user-card__info-container"><div class="tm-user-card__header"><div class="tm-user-card__header-data"><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-card__userpic tm-user-card__userpic_size-40"><div class="tm-entity-image"><img alt="" src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/e36812d3de38eb3d479d7a13228717ef(1).png" class="tm-entity-image__pic"></div></a><div class="tm-user-card__meta"><div title=" 943 голоса " class="tm-karma tm-user-card__karma"><div class="tm-karma__votes tm-karma__votes_positive">
    204.5
  </div><div class="tm-karma__text">
    Карма
  </div></div><div class="tm-rating tm-user-card__rating" title="Рейтинг пользователя"><div class="tm-rating__header"><div class="tm-rating__counter">110</div></div><div class="tm-rating__text">
    Рейтинг
  </div></div></div></div></div><div class="tm-user-card__info"><div class="tm-user-card__title"><!----><a href="https://habr.com/ru/users/ru_vds/" class="tm-user-card__nickname">
          @ru_vds
        </a><!----></div><p class="tm-user-card__short-info">Пользователь</p></div></div><div class="tm-user-card__buttons tm-user-card__buttons_variant-two-column"><!----><!----><!----><!----><!----></div></div><!----></div></div><!----></section><div class="tm-page-article__comments"><div class="tm-article-page-comments"><div class="tm-article-comments-counter-link tm-article-comments-counter-button"><a href="https://habr.com/ru/company/ruvds/blog/327754/comments/" class="tm-article-comments-counter-link__link tm-article-comments-counter-link__link_button-style"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon tm-article-comments-counter-link__icon_contrasted"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value tm-article-comments-counter-link__value_contrasted">
       Комментарии 18 
    </span></a><!----></div></div></div><!----><section class="tm-block tm-block_spacing-around"><header class="tm-block__header"><h2 class="tm-block__title">Похожие публикации</h2><!----></header><div class="tm-block__body"><ul class="tm-article-list-block__list"><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2020-12-09T09:47:23.000Z" title="2020-12-09, 16:47">9  декабря  2020 в 16:47</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/529840/" class="tm-article-title__link"><span>Кунг-фу стиля Linux: утилита marker и меню для командной строки</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 29: ↑28 и ↓1</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 29: ↑28 и ↓1" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+27</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">6.4K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    64
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/529840/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      4
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/529840/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +4
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2017-10-11T09:07:52.000Z" title="2017-10-11, 16:07">11  октября  2017 в 16:07</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/339820/" class="tm-article-title__link"><span>20 приёмов работы в командной строке Linux, которые сэкономят уйму времени</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 82: ↑46 и ↓36</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 82: ↑46 и ↓36" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+10</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">167K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    768
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/339820/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      87
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/339820/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +87
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2017-08-30T11:57:46.000Z" title="2017-08-30, 18:57">30  августа  2017 в 18:57</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/336764/" class="tm-article-title__link"><span>[в закладки] PDF-версия статей про Bash-скрипты</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 41: ↑35 и ↓6</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 41: ↑35 и ↓6" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+29</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">39K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    510
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/336764/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      20
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/336764/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +20
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><!----></ul></div><!----></section><!----><section class="tm-block tm-block_spacing-around"><header class="tm-block__header"><h2 class="tm-block__title">Лучшие публикации за сутки</h2><!----></header><div class="tm-block__body"><ul class="tm-article-list-block__list"><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T09:00:02.000Z" title="2021-08-26, 16:00">вчера в 16:00</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/574742/" class="tm-article-title__link"><span>Сетевые соединения X11</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 48: ↑46 и ↓2</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 48: ↑46 и ↓2" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+44</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">5.3K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    46
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/574742/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      9
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/574742/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +9
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T13:00:01.000Z" title="2021-08-26, 20:00">вчера в 20:00</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ruvds/blog/574352/" class="tm-article-title__link"><span>Осваиваем LaTeX за 30 минут</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 47: ↑43 и ↓4</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 47: ↑43 и ↓4" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+39</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">5K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    117
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ruvds/blog/574352/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      27
    </span></a><a href="https://habr.com/ru/company/ruvds/blog/574352/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +27
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T21:08:54.000Z" title="2021-08-27, 04:08">сегодня в 04:08</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/post/571514/" class="tm-article-title__link"><span>Самогонный аппарат — полный автомат. Часть 3. Заключительная</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 38: ↑37 и ↓1</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 38: ↑37 и ↓1" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+36</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">6.9K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    50
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/post/571514/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      7
    </span></a><a href="https://habr.com/ru/post/571514/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +7
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T17:24:20.000Z" title="2021-08-27, 00:24">сегодня в 00:24</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/kaspersky/blog/574884/" class="tm-article-title__link"><span>Sony Playstation Portable, радость коллекционера</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 33: ↑31 и ↓2</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 33: ↑31 и ↓2" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+29</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">6.5K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    15
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/kaspersky/blog/574884/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      15
    </span></a><a href="https://habr.com/ru/company/kaspersky/blog/574884/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +15
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><li class="tm-article-list-block__item"><article class="tm-article-snippet-block-block tm-article-snippet-block-block_preview"><div class="tm-article-snippet-block__user-meta"><div class="tm-article-snippet-block__date"><time datetime="2021-08-26T11:06:06.000Z" title="2021-08-26, 18:06">вчера в 18:06</time></div></div><h2 class="tm-article-title tm-article-title_block"><a href="https://habr.com/ru/company/ods/blog/572264/" class="tm-article-title__link"><span>Анализ вакансий и зарплат в Data Science</span></a></h2><div class="tm-data-icons"><!----><div class="tm-votes-meter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_small"><title>Всего голосов 30: ↑29 и ↓1</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-rating"></use></svg><span title="Всего голосов 30: ↑29 и ↓1" class="tm-votes-meter__value tm-votes-meter__value_positive tm-votes-meter__value_small">+28</span></div><span class="tm-icon-counter tm-data-icons__item" title="Количество просмотров"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-views"></use></svg><span class="tm-icon-counter__value">7.8K</span></span><button title="Добавить в закладки" type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">
    31
  </span></button><div class="tm-article-comments-counter-link tm-data-icons__item" title="Читать комментарии"><a href="https://habr.com/ru/company/ods/blog/572264/comments/" class="tm-article-comments-counter-link__link"><svg height="16" width="16" class="tm-svg-img tm-article-comments-counter-link__icon"><title>Комментарии</title><use xlink:href="/img/megazord-v24.cee85629.svg#counter-comments"></use></svg><span class="tm-article-comments-counter-link__value">
      11
    </span></a><a href="https://habr.com/ru/company/ods/blog/572264/comments/" class="tm-article-comments-counter-link__link"><span title="Читать новые комментарии" class="tm-article-comments-counter-link__unread-counter">
      +11
    </span></a></div><!----><div class="v-portal" style="display: none;"></div></div></article></li><!----></ul></div><!----></section><!----><!----></div></div></div><div class="tm-page__sidebar"><!----></div></div></div></div></main><!----></div><!----><div class="tm-footer"><div class="tm-page-width"><div class="tm-footer__container"><div class="tm-footer__title"><a href="https://habr.com/ru/" class="tm-svg-icon__wrapper tm-footer__title-link router-link-active"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Хабр</title><use xlink:href="/img/habr-logo-ru.svg#logo"></use></svg></a></div><div class="tm-footer__social"><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://www.facebook.com/habrahabr.ru" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Facebook</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-facebook"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://twitter.com/habr_com" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Twitter</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-twitter"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://vk.com/habr" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>VK</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-vkontakte"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://telegram.me/habr_com" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Telegram</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-telegram"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://www.youtube.com/channel/UCd_sTwKqVrweTt4oAKY5y4w" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Youtube</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-youtube"></use></svg></a><a class="tm-svg-icon__wrapper tm-social-icons__icon" href="https://zen.yandex.ru/habr" rel="nofollow noopener noreferrer" target="_blank"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Яндекс Дзен</title><use xlink:href="/img/social-icons-sprite.svg#social-logo-zen"></use></svg></a></div><div class="v-portal" style="display: none;"></div><button class="tm-footer__link"><svg height="16" width="16" class="tm-svg-img tm-footer__icon"><title>Язык</title><use xlink:href="/img/megazord-v24.cee85629.svg#lang"></use></svg>
        Настройка языка
      </button><a href="https://habr.com/ru/about" class="tm-footer__link">
        О сайте
      </a><a href="https://habr.com/ru/feedback/" class="tm-footer__link">
        Техническая поддержка
      </a><a href="https://habr.com/ru/company/ruvds/blog/327754/?mobile=no" class="tm-footer__link">
        Полная версия
      </a><a href="https://habr.com/berserk-mode-nope" class="tm-footer__link">
        Вернуться на старую версию
      </a><div class="tm-footer-copyright"><span class="tm-copyright"><span class="tm-copyright__years">© 2006–2021 </span><span class="tm-copyright__name">«<a href="https://company.habr.com/" rel="noopener" target="_blank" class="tm-copyright__link">Habr</a>»</span></span></div></div></div></div><!----><!----></div><div class="vue-portal-target"><!----></div></div>

<script src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/chunk-vendors.1ca41abb.js" defer=""></script><script src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/about.2d3fd602.js" defer=""></script><script src="./Bash-скрипты, часть 8_ язык обработки данных awk _ Блог компании RUVDS.com _ Хабр_files/app.132461d8.js" defer=""></script>



    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
    </script>
  
  <script type="text/javascript">
    (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
    m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
    (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");

    ym(24049213, "init", {
      defer:true,
      trackLinks:true,
      accurateTrackBounce:true,
      webvisor:false,
    });
  </script>
  <noscript>
    <div>
      <img src="https://mc.yandex.ru/watch/24049213" style="position:absolute; left:-9999px;" alt="" />
    </div>
  </noscript>
  
    <script type="text/javascript">
      window.addEventListener('load', function () {
        setTimeout(() => {
          const img = new Image();
          img.src = 'https://vk.com/rtrg?p=VK-RTRG-421343-57vKE';
        }, 0);
      });
    </script>
  


<div><div><div class="Vue-Toastification__container top-left"></div></div><div><div class="Vue-Toastification__container top-center"></div></div><div><div class="Vue-Toastification__container top-right"></div></div><div><div class="Vue-Toastification__container bottom-left"></div></div><div><div class="Vue-Toastification__container bottom-center"></div></div><div><div class="Vue-Toastification__container bottom-right"></div></div></div></body></html>